package com.yonyou.cyxdms.sysmanage.client.service.login;

import com.yonyou.cyx.framework.bean.dto.framework.RestResultResponse;
import com.yonyou.cyxdms.framework.bean.dto.push.PushDTO;
import com.yonyou.cyxdms.sysmanage.client.domains.dto.EmployeeDictDto;
import com.yonyou.cyxdms.sysmanage.client.domains.dto.UserAndRoleDTO;
import com.yonyou.cyxdms.sysmanage.client.domains.dto.UserDictDto;
import com.yonyou.cyxdms.sysmanage.client.vo.advice.AdviceRuleVO;
import com.yonyou.cyxdms.sysmanage.client.vo.company.CompanyDealerAscVO;
import com.yonyou.cyxdms.sysmanage.client.vo.company.CompanyOrgMaintenanceTreeVO;
import com.yonyou.cyxdms.sysmanage.client.vo.company.CompanyOrgVO;
import com.yonyou.cyxdms.sysmanage.client.vo.company.CompanyVO;
import com.yonyou.cyxdms.sysmanage.client.vo.dealer.DealerInfoParentVO;
import com.yonyou.cyxdms.sysmanage.client.vo.dealer.DealerOrgAreaVO;
import com.yonyou.cyxdms.sysmanage.client.vo.dealer.DealerPictureVO;
import com.yonyou.cyxdms.sysmanage.client.vo.employee.EmployeeVO;
import com.yonyou.cyxdms.sysmanage.client.vo.org.OrgAndParentVO;
import com.yonyou.cyxdms.sysmanage.client.vo.org.OrgParentVO;

import java.util.List;
import java.util.Map;

/**
 * 系统模块提供的接口
 *
 * @author: maxingjain
 * @since: 2019/08/14
 * @version:1.0 Copyright: Copyright (c) 2018
 */
public interface LoginService {

    /**
     * 通过userId获取user对象
     *
     * @param userId
     * @return UserInfoDto
     * @author maxingjian
     * @date 2019年08月13日
     */
    public UserDictDto getUserById(Long userId);

    public UserDictDto getUserByIdCMS(Long userId);

    /**
     * 通过userIds获取user集合对象
     *
     * @param userIds
     * @return List<UserDictDto>
     * @author wy
     * @date 2020年04月18日
     */
    public List<UserDictDto> getUserListByIds(List<Long> userIds);

    /**
     * 通过userId获取Employee对象
     *
     * @param employeeId
     * @return UserInfoDto
     * @author maxingjian
     * @date 2019年08月13日
     */
    public EmployeeDictDto getEmployeeById(Long employeeId);

    /**
     * 极光推送
     *
     * @param pushDTO
     * @return String
     * @author maxingjian
     * @date 2019年08月13日
     */
    public String pushByUserIdOrEmpNo(PushDTO pushDTO);

    /**
     * 通过条件查询返回本人本组织sql语句
     *
     * @param menuId
     * @param alias
     * @param orgColumn
     * @param salesColumn
     * @return String
     * @author maxingjian
     * @date 2019年08月13日
     */
    public String getQueryScope(Long menuId, String alias, String orgColumn, String salesColumn);

    /**
     * 通过条件查询返回本人本组织sql语句
     *
     * @param menuId
     * @param alias
     * @param orgColumn
     * @param salesColumn
     * @return String
     * @author maxingjian
     * @date 2019年08月13日
     */
    public String getQueryScope(Long menuId, String alias, String orgColumn, String salesColumn, boolean isDealer);


    /**
     * 通过条件查询返回本人本组织sql语句
     *
     * @param menuId
     * @param alias
     * @param orgColumn
     * @param salesColumn
     *  @param isDealer
     * @return String
     * @author maxingjian
     * @date 2019年12月25日
     */
    public String getQueryScope(Long menuId, String alias, String orgColumn, String salesColumn, boolean isDealer,boolean needSaleCode,boolean needServiceCode);

    /**
     * 通过条件查询返回本人本组织sql语句
     *
     * @param menuId
     * @return String
     * @author maxingjian
     * @date 2019年10月10日
     */
    public String findPermissionRangeByMenu(Long menuId);

    /**
     * 通过条件查询返回本人本组织sql语句
     *
     * @return String
     * @author maxingjian
     * @date 2019年08月13日
     */
    public String getQueryScope();

    /**
     * 通过条件查询返回本人本组织sql语句
     *
     * @param alias
     * @return String
     * @author maxingjian
     * @date 2019年08月13日
     */
    public String getQueryScope(String alias);


    public RestResultResponse<Map<String, Object>> getRoles(String userId);


    public List<EmployeeVO> getEmployeeNoByLikeEmployeeName(String appId, String ownerCode, String employeeName);


    /**
     * 根据角色类别获取用户信息
     *
     * @param role 角色类别
     * @return
     * @author 李贺
     * @since 2019/9/9
     */
    public List<UserAndRoleDTO> getUserListByRole(Integer role);

    /**
     * 获取登录用户组织信息
     *
     * @auther: 李贺
     * @since: 2019/9/9
     */
    public OrgAndParentVO getOrg(String orgId);


    public Void pushBy(String title, Integer templateCode, Integer userIds, Map<String, Object> templateContentMap);

    public Void pushBys(Integer kind, Integer businessId, String orderID, String recordVersion, String actionId, String clueId, String clueType,
                        String customerBusinessId, String dataType, String title, Integer templateCode, Integer userIds, Map<String, Object> templateContentMap);

    /**
     * 消息推送智慧通
     * @param kind
     * @param businessId
     * @param orderID
     * @param recordVersion
     * @param actionId
     * @param clueId
     * @param clueType
     * @param customerBusinessId
     * @param dataType
     * @param title
     * @param templateCode
     * @param userIds
     * @param templateContentMap
     * @return
     */
    public Void pushBysZHT(Integer kind, Integer businessId, String orderID, String recordVersion, String actionId, String clueId, String clueType,
                        String customerBusinessId, String dataType, String title, Integer templateCode, Integer userIds,String jwt, Map<String, Object> templateContentMap);



    /**
     * 新增接口，保存公司表、经销商表、服务站表、组织表、组织关系表、
     * 人员表、用户表、员工表、职位表、角色表、app版本表、
     * 用户菜单表他的两个子表、员工菜单表以及他的两个子表。
     *
     * @author 李贺
     * @since 2019/9/10
     */
    public CompanyDealerAscVO addDealerCompany(CompanyDealerAscVO companyDealerAscVO);

    /**
     * 新增多个公司
     *
     * @author 李贺
     * @since 2019/12/2
     */
    List<CompanyDealerAscVO> addDealerCompanyList(List<CompanyDealerAscVO> companyDealerAscVOList);

    /**
     * 更新接口，更新公司表、经销商表、服务站表
     *
     * @author 李贺
     * @since 2019/9/12
     */
    public CompanyDealerAscVO updateDealerCompany(CompanyDealerAscVO companyDealerAscVO);

    public List<AdviceRuleVO> findAdviceRules(String paramCode);

    public CompanyVO getCompany(Long companyId);

    public Integer getAppPosition();

    public List<com.yonyou.cyxdms.sysmanage.client.vo.user.UserInfoVO> getUsersByPosition(Long menuId, List<Integer> positionCodes, String userPhone);

    /**
     * 根据条件查询经销商信息
     *
     * @auther: 李贺
     * @since: 2019/11/13
     */

    List<DealerInfoParentVO> getDealerInfos(Long orgId, Long provinceId);

    /**
     * 查询用户职位
     * 李贺
     */
    List<Integer> getPositions(Long userId);

    /**
     * 根据省市区查询经销商信息
     *
     * @auther: 李贺
     * @since: 2019/11/15
     */
    List<DealerInfoParentVO> getDealerByCity(Integer provinceId, Integer cityId, Integer countyId);

    /**
     * 根据orgId获得所有的人员信息
     *
     * @author 李贺
     * @since 2019/11/19
     */
    List<com.yonyou.cyxdms.sysmanage.client.vo.user.UserInfoVO> getUserByOrgId(String orgId);

    /**
     * 获得所有经销商信息
     *
     * @auther: 李贺
     */
    List<DealerInfoParentVO> getAllDealer(String orgId);

    /**
     * 获取所有事业部
     *
     * @return
     * @author 李贺
     * @since 2019/11/25
     */
    List<OrgParentVO> getBusinessOrg();

    /**
     * 获得当前车厂的信息
     *
     * @return: 获得当前车厂的信息
     * @auther: 李贺
     * @since: 2019/11/26
     */
    CompanyVO factoryCompany();

    /**
     * 根据userName获得userId
     */
    List<Long> getUserIdByName(String appId, String ownerCode, String name);

    /**
     * 车厂通过组织id（大区小区类型的组织）获取本车厂下对应的经销商
     *
     * @param orgId
     * @param:
     * @return: 车厂通过组织id（大区小区类型的组织）获取本车厂下对应的经销商
     * @auther: 马邢健
     * @since: 2019/10/31
     */
    List<DealerOrgAreaVO> getDealerBySaleArea(String orgId, String dealerCode, String dealerName);

    /**
     * 根据组织id 获得组织信息
     *
     * @auther: 李贺
     * @since: 2019/12/6
     */
    List<OrgParentVO> getOrgByOrgIds(String orgIds);

    /**
     * 获取树状图
     *
     * @author 李贺
     * @since 2019/12/12
     */
    List<CompanyOrgMaintenanceTreeVO> getOrgs();

    /**
     * 获取树状图
     *
     * @author wst
     * @since 2021/12/2
     */
    List<CompanyOrgMaintenanceTreeVO> getDrlOrgs();

    /**
     * 获取车厂所有组织
     *
     * @author zys
     * @since 2020/02/05
     */
    List<CompanyOrgVO> getOrgsNoCompanyId();

    /**
     * 获得经销商所属区域
     * 李贺
     *
     * @param
     * @return
     */
    List<OrgParentVO> getSaleArea(List<Long> dealerIds);

    /**
     * 获取经销商营业时间和门店图片
     * <p>
     * 李贺
     */
    List<DealerPictureVO> getDealerPictures(String dealerIds, String dealerCodes);
}
